home *** CD-ROM | disk | FTP | other *** search
- #define DISABLE_LOCAL_CALLTRACE 1 // Set to 1 to disable Call Traces for this file.
- #define DISABLE_LOCAL_DEBUG 0 // Set to 1 to disable all debugging for this file.
- #include "DebugUtils.h"
-
- #include <Gestalt.h>
- #include <Traps.h>
- #include <Displays.h>
- #include "ContextUtils.h"
- #include "Nub.h"
- #include "PatchHarness.h"
- #include "ProcInfo.h"
-
-
-
-
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- enum
- {
- _SynchIdleTime = 0xABF7
- };
-
- pascal OSStatus main(PatchDesc **patchList);
- static pascal void Install(struct PatchDesc *desc,UniversalProcPtr patch);
- static pascal void Remove(struct PatchDesc *desc);
- static void DMFinalInitPatchHarness(void);
- pascal void DMNotifierPatchHarness(AppleEvent *aevent);
- static void SetDMFinalInitTrapAddress(UniversalProcPtr addr);
- static void SetDMFinalInitPatchAddress(UniversalProcPtr addr);
- static pascal SInt32 DragGrayRgnPatchHarness(RgnHandle rgn,Point start,const Rect *limit,const Rect *slop,SInt16 axis,DragGrayRgnUPP action);
- static pascal OSErr GestaltSelectorHarness(OSType selector,SInt32 *response);
- static pascal void GetMousePatchHarness(Point *mouseLoc);
- static pascal SInt32 MenuSelectPatchHarness(Point *startPt);
- static void SetGestaltSelectorResult(SInt32 value);
- static void SynchIdleTimePatchHarness(void);
- static void SetSynchIdleTimeTrapAddress(UniversalProcPtr addr);
- static void SetSynchIdleTimePatchAddress(UniversalProcPtr addr);
-
- #ifdef __cplusplus
- }
- #endif
-
-
-
-
-
- PatchDesc gDMFinalInitDesc;
- DMNotificationProcPtr gDMNotificationProc = NULL;
- PatchDesc gDMNotificationDesc;
- DragGrayRgnLWProcPtr gDragGrayRgnTrap = NULL;
- DragGrayRgnPatchPtr gDragGrayRgnPatch = NULL;
- PatchDesc gDragGrayRgnDesc;
- GetMouseProcPtr gGetMouseTrap = NULL;
- GetMousePatchPtr gGetMousePatch = NULL;
- PatchDesc gGetMouseDesc;
- MenuSelectProcPtr gMenuSelectTrap = NULL;
- MenuSelectPatchPtr gMenuSelectPatch = NULL;
- PatchDesc gMenuSelectDesc;
- PatchDesc gGestaltSelectorDesc;
- PatchDesc gSynchIdleTimeDesc;
-
-
-
-
-
- pascal OSStatus main(PatchDesc **patchList)
- {
- GlobalContext globals;
- PatchDesc *head = *patchList;
- ProcessSerialNumber psn;
- OSStatus err;
-
-
- // Install Gestalt selector.
- gGestaltSelectorDesc.type = 'GSEL';
- gGestaltSelectorDesc.install = Install;
- gGestaltSelectorDesc.remove = Remove;
- gGestaltSelectorDesc.next = head;
- head = &gGestaltSelectorDesc;
-
- err = NewGestalt(kNubSelector,GestaltSelectorHarness);
- if (err != noErr)
- {
- OSType selector = kNubSelector;
- dprintf(kDConPrefix "NewGestalt('%.4s') failed: %ld\n",&selector,err);
- return err;
- }
-
- // Install _DisplayDispatch(DMFinalInit) patch.
- gDMFinalInitDesc.type = 'DMFI';
- gDMFinalInitDesc.install = Install;
- gDMFinalInitDesc.remove = Remove;
- gDMFinalInitDesc.next = head;
- head = &gDMFinalInitDesc;
-
- SetDMFinalInitTrapAddress(NGetTrapAddress(_DisplayDispatch,ToolTrap));
- NSetTrapAddress((UniversalProcPtr)DMFinalInitPatchHarness,_DisplayDispatch,ToolTrap);
-
- // Install DMNotificationProc.
- gDMNotificationDesc.type = 'DMNt';
- gDMNotificationDesc.install = Install;
- gDMNotificationDesc.remove = Remove;
- gDMNotificationDesc.next = head;
- head = &gDMNotificationDesc;
-
- psn.highLongOfPSN = kNoProcess;
- psn.lowLongOfPSN = kNoProcess;
- err = DMRegisterNotifyProc(DMNotifierPatchHarness,&psn);
- if (err != noErr)
- return err;
-
- // Install _DragGrayRgn patch.
- gDragGrayRgnDesc.type = 'DrgG';
- gDragGrayRgnDesc.install = Install;
- gDragGrayRgnDesc.remove = Remove;
- gDragGrayRgnDesc.next = head;
- head = &gDragGrayRgnDesc;
-
- gDragGrayRgnTrap = (DragGrayRgnLWProcPtr)NGetTrapAddress(_DragGrayRgn,ToolTrap);
- NSetTrapAddress((UniversalProcPtr)DragGrayRgnPatchHarness,_DragGrayRgn,ToolTrap);
-
- // Install _GetMouse patch.
- gGetMouseDesc.type = 'GetM';
- gGetMouseDesc.install = Install;
- gGetMouseDesc.remove = Remove;
- gGetMouseDesc.next = head;
- head = &gGetMouseDesc;
-
- gGetMouseTrap = (GetMouseProcPtr)NGetTrapAddress(_GetMouse,ToolTrap);
- NSetTrapAddress((UniversalProcPtr)GetMousePatchHarness,_GetMouse,ToolTrap);
-
- // Install _MenuSelect patch.
- gMenuSelectDesc.type = 'MenS';
- gMenuSelectDesc.install = Install;
- gMenuSelectDesc.remove = Remove;
- gMenuSelectDesc.next = head;
- head = &gMenuSelectDesc;
-
- gMenuSelectTrap = (MenuSelectProcPtr)NGetTrapAddress(_MenuSelect,ToolTrap);
- NSetTrapAddress((UniversalProcPtr)MenuSelectPatchHarness,_MenuSelect,ToolTrap);
-
- // Install _SynchIdleTime patch.
- gSynchIdleTimeDesc.type = 'IDLE';
- gSynchIdleTimeDesc.install = Install;
- gSynchIdleTimeDesc.remove = Remove;
- gSynchIdleTimeDesc.next = head;
- head = &gSynchIdleTimeDesc;
-
- SetSynchIdleTimeTrapAddress(NGetTrapAddress(_SynchIdleTime,ToolTrap));
- NSetTrapAddress((UniversalProcPtr)SynchIdleTimePatchHarness,_SynchIdleTime,ToolTrap);
-
- // Set patch list.
- *patchList = head;
- return noErr;
- }
-
-
-
-
-
- pascal void Install(struct PatchDesc *desc,UniversalProcPtr patch)
- {
- GlobalContext globals;
-
-
- switch(desc->type)
- {
- case 'DMFI':
- SetDMFinalInitPatchAddress((UniversalProcPtr)patch);
- break;
-
- case 'DMNt':
- gDMNotificationProc = (DMNotificationProcPtr)patch;
- break;
-
- case 'DrgG':
- gDragGrayRgnPatch = (DragGrayRgnPatchPtr)patch;
- break;
-
- case 'GetM':
- gGetMousePatch = (GetMousePatchPtr)patch;
- break;
-
- case 'GSEL':
- // Remove Gestalt selector result.
- SetGestaltSelectorResult((SInt32)patch);
- break;
-
- case 'MenS':
- gMenuSelectPatch = (MenuSelectPatchPtr)patch;
- break;
-
- case 'IDLE':
- SetSynchIdleTimePatchAddress((UniversalProcPtr)patch);
- break;
-
- default:
- dprintf(kDConPrefix "Install: patch '%.4s' not found\n",&desc->type);
- break;
- }
- }
-
-
-
-
-
- pascal void Remove(struct PatchDesc *desc)
- {
- GlobalContext globals;
-
-
- switch(desc->type)
- {
- case 'DMFI':
- SetDMFinalInitPatchAddress((UniversalProcPtr)NULL);
- break;
-
- case 'DMNt':
- gDMNotificationProc = (DMNotificationProcPtr)NULL;
- break;
-
- case 'DrgG':
- gDragGrayRgnPatch = (DragGrayRgnPatchPtr)NULL;
- break;
-
- case 'GetM':
- gGetMousePatch = (GetMousePatchPtr)NULL;
- break;
-
- case 'GSEL':
- // Remove Gestalt selector result.
- SetGestaltSelectorResult((SInt32)0);
- break;
-
- case 'MenS':
- gMenuSelectPatch = (MenuSelectPatchPtr)NULL;
- break;
-
- case 'IDLE':
- SetSynchIdleTimePatchAddress((UniversalProcPtr)NULL);
- break;
-
- default:
- dprintf(kDConPrefix "Remove: patch '%.4s' not found\n",&desc->type);
- break;
- }
- }
-
-
-
-
-
- asm void DMFinalInitPatchHarness(void)
- {
- MOVEA.L @PatchAddressStorage,A0 // Put address of patch into A0.
- CMPA.W #0x0000,A0 // Compare address of patch to NULL.
- BEQ.S @CallRealTrap // Goto @CallRealTrap if was NULL.
- CMPI.W #0x01ED,D0 // Check for targetted selector.
- BNE.S @CallRealTrap // Goto @CallRealTrap if was NULL.
-
- SUBA.W #4,SP // Call it so we can tail patch
- MOVE.L D0,-(SP)
- MOVE.W 12(SP),D0
- MOVE.W D0,4(SP)
- MOVE.L (SP)+,D0
- MOVEA.L @TrapAddressStorage,A0 // Put address of trap in A0.
- JSR (A0)
- ADDA.W #2,SP
- MOVE.L (SP)+,D0
- ADDA.W #2,SP
- CLR.W (SP)
- MOVEM.L A0-A1/D0-D2,-(SP) // Save CPU state on stack.
- MOVEA.L @PatchAddressStorage,A0 // Put address of patch into A0.
- JSR (A0) // Call patch code.
- MOVEM.L (SP)+,A0-A1/D0-D2 // Restore CPU state from stack.
- MOVE.L D0,-(SP)
- RTS
-
- @CallRealTrap:
- MOVE.L @TrapAddressStorage,-(SP) // Put address of trap in the stack.
- RTS // Directly RTS back to real trap.
-
- entry static SetDMFinalInitTrapAddress
- LEA @TrapAddressStorage,A0
- MOVE.L 4(SP),(A0)
- RTS
-
- entry static SetDMFinalInitPatchAddress
- LEA @PatchAddressStorage,A0
- MOVE.L 4(SP),(A0)
- RTS
-
- @TrapAddressStorage:
- DC.L 0x00000000 // Storage for trap address.
- @PatchAddressStorage:
- DC.L 0x00000000 // Storage for patch address.
- }
-
-
-
-
-
- pascal void DMNotifierPatchHarness(AppleEvent *aevent)
- {
- GlobalContext globals;
-
- if (gDMNotificationProc != NULL)
- CallDMNotificationProc(gDMNotificationProc,aevent);
- }
-
-
-
-
-
- pascal SInt32 DragGrayRgnPatchHarness(RgnHandle rgn,Point start,const Rect *limit,const Rect *slop,SInt16 axis,DragGrayRgnUPP action)
- {
- DragGrayRgnLWProcPtr dragGrayRgnTrap;
- DragGrayRgnPatchPtr dragGrayRgnPatch;
- SInt32 result;
-
-
- {
- GlobalContext globals;
-
- dragGrayRgnTrap = gDragGrayRgnTrap;
- dragGrayRgnPatch = gDragGrayRgnPatch;
- }
-
- // Call patch, if installed.
- if (dragGrayRgnPatch != NULL)
- result = CallDragGrayRgnPatch(dragGrayRgnPatch,rgn,start,limit,slop,axis,action,dragGrayRgnTrap);
- else
- {
- // Call real DragGrayRgn.
- result = CallDragGrayRgnLWProc(dragGrayRgnTrap,rgn,start,limit,slop,axis,action);
- }
-
- return result;
- }
-
-
-
-
-
- asm pascal OSErr GestaltSelectorHarness(OSType selector,SInt32 *response)
- {
- MOVEA.L 4(SP),A0 // Move response into A0.
- MOVE.L @ResultStorage,(A0) // Move *ResultStorage into *response.
- CLR.W 12(SP) // Set the return value to no error.
- RTD #8 // Clean up pascal stack frame and return.
-
- entry static SetGestaltSelectorResult
- LEA @ResultStorage,A0
- MOVE.L 4(SP),(A0)
- RTS
-
- @ResultStorage:
- DC.L 0x00000000 // 4 Byte return value.
- }
-
-
-
-
-
- pascal void GetMousePatchHarness(Point *mouseLoc)
- {
- GetMouseProcPtr getMouseTrap;
- GetMousePatchPtr getMousePatch;
-
-
- {
- GlobalContext globals;
-
- getMouseTrap = gGetMouseTrap;
- getMousePatch = gGetMousePatch;
- }
-
- // Call patch, if installed.
- if (getMousePatch != NULL)
- CallGetMousePatch(getMousePatch,mouseLoc,getMouseTrap);
- else
- {
- // Call real GetMouse.
- CallGetMouseProc(getMouseTrap,mouseLoc);
- }
- }
-
-
-
-
-
- pascal SInt32 MenuSelectPatchHarness(Point *startPt)
- {
- MenuSelectProcPtr menuSelectTrap;
- MenuSelectPatchPtr menuSelectPatch;
- SInt32 result;
-
-
- {
- GlobalContext globals;
-
- menuSelectTrap = gMenuSelectTrap;
- menuSelectPatch = gMenuSelectPatch;
- }
-
- // Call patch, if installed.
- if (menuSelectPatch != NULL)
- result = CallMenuSelectPatch(menuSelectPatch,startPt,menuSelectTrap);
- else
- {
- // Call real MenuSelect.
- result = CallMenuSelectProc(menuSelectTrap,startPt);
- }
-
- return result;
- }
-
-
-
-
-
- asm void SynchIdleTimePatchHarness(void)
- {
- MOVEA.L @TrapAddressStorage,A1 // Put address of trap into A1.
- MOVEA.L @PatchAddressStorage,A0 // Put address of patch into A0.
- CMPA.W #0x0000,A0 // Compare address of patch to NULL.
- BEQ.S @CallRealTrap // Goto @CallRealTrap if was NULL.
-
- MOVEM.L D3-D7/A1-A6,-(A7) // Save CPU state on stack.
- JSR (A0) // Call patch code.
- MOVEM.L (A7)+,D3-D7/A1-A6 // Restore CPU state from stack.
-
- @CallRealTrap:
- JMP (A1) // Directly jump to real trap.
-
- entry static SetSynchIdleTimeTrapAddress
- LEA @TrapAddressStorage,A0
- MOVE.L 4(SP),(A0)
- RTS
-
- entry static SetSynchIdleTimePatchAddress
- LEA @PatchAddressStorage,A0
- MOVE.L 4(SP),(A0)
- RTS
-
- @TrapAddressStorage:
- DC.L 0x00000000 // Storage for trap address.
- @PatchAddressStorage:
- DC.L 0x00000000 // Storage for patch address.
- }
-